﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using Rezepto.Account;
using Rezepto.DatenbankObjekte;
using Rezepto.DatenbankVerbindung;

namespace Rezepto
{
    public partial class Default : LoginPage
    {
        private Rezept _currentRezept;

        protected void Page_Load(object sender, EventArgs e)
        {
            string rezeptidString = Request.Params.Get("rezeptid");
            int rezeptid;
            Rezept rezept = null;
            int.TryParse(rezeptidString, out rezeptid);
            if (rezeptid != 0)
            {
                rezept = MsSqlVerbindung.LeseRezept(rezeptid);
            }
            if (rezept != null)
            {
                if(IsLoggedIn() != null)
                {
                    Kommentar.Visible = true;
                    SaveCommentaryButton.Visible = true;
                    UserIdFeld.Text = IsLoggedIn().Id.ToString();
                    BildUpload.Visible = true;
                    BildUploadButton.Visible = true;
                    FileUpload.Visible = true;
                }
                _currentRezept = rezept;
                RezeptIdFeld.Text = rezept.RezeptId.ToString();
                RezeptIdFeld.Attributes.Add("style", "visibility:hidden");
                UserIdFeld.Attributes.Add("style", "visibility:hidden");
                BilderGesamt.Text = rezept.Bilder.Count.ToString();
                BilderGesamt.Attributes.Add("style", "visibility:hidden");
                RezeptName.Text = string.Format("{0} - {1}", rezept.RezeptName, rezept.Kategorie);
                ZubereitungHeader.Text = "Zubereitung";
                KommentarHeader.Text = "Kommentare";
                if (rezept.Bilder.Count > 0)
                {
                    string base64String = Convert.ToBase64String(rezept.Bilder.First(), 0, rezept.Bilder.First().Length);
                    RezeptBilder.ImageUrl = "data:image/png;base64," + base64String;
                    RezeptBilder.Attributes.Add("onclick", "GetNextPicture()");
                    RezeptBilder.Attributes.Add("style", "cursor: pointer;");
                }
                else
                {
                    RezeptBilder.ImageUrl = "~/Pics/keinbildgr.png";
                }
                RezeptZubereitung.Text = rezept.Zubereitung;
                BuildCommentaryTable(rezept);
                BuildIngridientTable(rezept.Zutaten);
                BuildBewertungPanel();
            }
            else
            {
                BegruessungText.Text = "Willkommen bei Rezepto, dem Onlinerezeptbuch.";
            }
        }

        private void BuildBewertungPanel()
        {
            RezeptSuche.SetRatingPictures(BewertungPlaceHolder, _currentRezept.Bewertung, true);
            var bewertungsLabel = new Label();
            bewertungsLabel.ID = "RatingValue";
            bewertungsLabel.Text = "(" + _currentRezept.Bewertung.ToString("#.#") + ")";
            BewertungPlaceHolder.Controls.Add(bewertungsLabel);
        }

        private void BuildIngridientTable(List<Zutat> zutaten)
        {
            ZutatenHeader.Visible = true;
            ZutatenHeader.Text = "Zutaten";
            TableHeaderRow th = new TableHeaderRow();
            th.Cells.Add(new TableHeaderCell { Text = "Menge" });
            th.Cells.Add(new TableHeaderCell { Text = "Einheit" });
            th.Cells.Add(new TableHeaderCell { Text = "" });
            ZutatenTable.Rows.Add(th);
            
            int zählerZutaten = 0;
            if (zutaten.Count > 11)
            {
                AddDummyHeader();
            }
            foreach (var zutat in zutaten)
            {
                var tableRow = new TableRow();
                if (zählerZutaten <= 10)
                {
                    tableRow.Cells.Add(new TableCell {Text = zutat.Menge.ToString(CultureInfo.InvariantCulture)});
                    tableRow.Cells.Add(new TableCell {Text = zutat.Einheit});
                    tableRow.Cells.Add(new TableCell {Text = zutat.ZutatName});
                    ZutatenTable.Rows.Add(tableRow);
                }
                else
                {
                    tableRow.Cells.Add(new TableCell { Text = zutat.Menge.ToString(CultureInfo.InvariantCulture) });
                    tableRow.Cells.Add(new TableCell { Text = zutat.Einheit });
                    tableRow.Cells.Add(new TableCell { Text = zutat.ZutatName });
                    ZutatenTable2.Rows.Add(tableRow);
                }
                zählerZutaten++;
            }
        }

        private void AddDummyHeader()
        {
            var dummyHeader = new TableHeaderRow();
            dummyHeader.Cells.Add(new TableHeaderCell {Text = " "});
            dummyHeader.Cells.Add(new TableHeaderCell {Text = " "});
            dummyHeader.Cells.Add(new TableHeaderCell {Text = " "});
            ZutatenTable2.Rows.Add(dummyHeader);
        }

        private void BuildCommentaryTable(Rezept rezept)
        {
            RezeptKommentare.Width = 500;
            RezeptKommentare.Visible = true;
            RezeptKommentare.BorderStyle = BorderStyle.Solid;
            RezeptKommentare.BorderWidth = new Unit(1, UnitType.Pixel);
            foreach (var kommentar in rezept.Kommentare)
            {
                var tableHeaderRow = new TableHeaderRow();
                var userHeaderCell = new TableCell();
                var kommentarRow = new TableRow();
                var kommentarCell = new TableCell();
                tableHeaderRow.BackColor = Color.LightGray;
                userHeaderCell.Text = "Kommentar von " + "<b>" + kommentar.Benutzername + "</b> " + "am <b>" + kommentar.Datum.ToShortDateString() + "</b>";
                kommentarCell.Text = kommentar.KommentarText;

                tableHeaderRow.Cells.Add(userHeaderCell);
                kommentarRow.Cells.Add(kommentarCell);

                RezeptKommentare.Rows.Add(tableHeaderRow);
                RezeptKommentare.Rows.Add(kommentarRow);
            }
        }

        protected void SaveCommentary(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(Kommentar.Text) && IsLoggedIn() != null)
            {
                var kommentar = new Kommentar();
                kommentar.UserId = IsLoggedIn().Id;
                kommentar.Datum = DateTime.Now;
                kommentar.RezeptId = _currentRezept.RezeptId;
                kommentar.KommentarText = Kommentar.Text;
                kommentar.KommentarId = MsSqlVerbindung.GetNextSequenceForTable("Kommentar");

                MsSqlVerbindung.SaveCommentary(kommentar);
                Response.Redirect("Default.aspx?rezeptid=" + _currentRezept.RezeptId);
            }
        }

        protected void SavePicture(object sender, EventArgs e)
        {
            var bild = FileUpload.FileBytes;
            if (bild.Length > 0)
            {
                var bildId = MsSqlVerbindung.GetNextSequenceForTable("BILD");
                MsSqlVerbindung.SpeicherBild(bild, bildId, _currentRezept.RezeptId, IsLoggedIn().Id);
                Response.Redirect("Default.aspx?rezeptid=" + _currentRezept.RezeptId);
            }
        }
    }
}